package com.fruit.service.fruit;

import com.fruit.bean.dto.fruit.FruitProfitInfoDto;
import com.fruit.bean.dto.fruit.FruitStockOrderInfoDto;
import com.fruit.bean.entity.fruit.*;
import com.fruit.bean.entity.system.User;
import com.fruit.bean.enumeration.fruit.FruitSellReqResEnum;
import com.fruit.dao.fruit.FruitProfitRepository;
import com.fruit.service.BaseService;
import com.fruit.utils.BigDecimalUtils;
import com.fruit.utils.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class FruitProfitService extends BaseService<FruitProfitInfo,Long, FruitProfitRepository> {

    @Autowired
    private FruitStockService stockService;

    @Autowired
    private FruitTypeService typeService;

    @Autowired
    private FruitShelfService shelfService;

    public List<FruitProfitInfoDto> listProfit() {
        List<FruitProfitInfo> profitInfoList = this.queryAll();
        List<FruitProfitInfoDto> fruitProfitInfoDtoList = new ArrayList<>();
        for(FruitProfitInfo fruitProfitInfo : profitInfoList){
            FruitProfitInfoDto fruitProfitInfoDto = new FruitProfitInfoDto();
            fruitProfitInfoDto.setId(fruitProfitInfo.getId());
            fruitProfitInfoDto.setProfit(fruitProfitInfo.getProfit());
            fruitProfitInfoDto.setProfitTime(DateUtil.getTime(fruitProfitInfo.getCreateTime()));
            fruitProfitInfoDto.setProfitDate(fruitProfitInfo.getCreateTime());
            if(fruitProfitInfo.getProfitType() == 0){
                // 库存收益
                FruitStockInfo fruitStockInfo = stockService.get(fruitProfitInfo.getStockInfoId());
                fruitProfitInfoDto.setProfitType("库存管理费");
                FruitTypeInfo typeInfo = typeService.get(fruitStockInfo.getFruitTypeId());
                fruitProfitInfoDto.setStockOrShelfName(typeInfo.getFruitTypeName());
            }else{
                // 代卖收益
                FruitShelfInfo shelfInfo = shelfService.get(
                        fruitProfitInfo.getShelfInfoId());
                fruitProfitInfoDto.setProfitType("代卖收益");
                fruitProfitInfoDto.setStockOrShelfName(shelfInfo.getFruitShelfName());
            }
            fruitProfitInfoDtoList.add(fruitProfitInfoDto);
        }
        return fruitProfitInfoDtoList;
    }

    public List<FruitProfitInfoDto> listProfitTotal() {
        List<FruitProfitInfo> profitInfoList = this.queryAll();
        Map<Long,FruitProfitInfoDto> fruitProfitInfoDtoMap = new HashMap<>();
        for(FruitProfitInfo fruitProfitInfo : profitInfoList){
            FruitProfitInfoDto fruitProfitInfoDto = new FruitProfitInfoDto();
            if(fruitProfitInfo.getProfitType() == 0){
                FruitStockInfo fruitStockInfo = stockService.get(fruitProfitInfo.getStockInfoId());
                // 库存收益
                if(fruitProfitInfoDtoMap.containsKey(fruitStockInfo.getId())){
                    //判断是否已经有对应库存，有则直接加上对应的收益
                    FruitProfitInfoDto profitInfoDto = fruitProfitInfoDtoMap.get(fruitStockInfo.getId());
                    profitInfoDto.setProfit(BigDecimalUtils.add(profitInfoDto.getProfit(),
                            fruitProfitInfo.getProfit()).doubleValue());
                    fruitProfitInfoDtoMap.put(fruitStockInfo.getId(),profitInfoDto);
                    continue;
                }
                fruitProfitInfoDto.setProfitType("库存管理费");
                FruitTypeInfo typeInfo = typeService.get(fruitStockInfo.getFruitTypeId());
                fruitProfitInfoDto.setStockOrShelfName(typeInfo.getFruitTypeName());
                fruitProfitInfoDto.setId(fruitProfitInfo.getId());
                fruitProfitInfoDto.setProfit(fruitProfitInfo.getProfit());
                fruitProfitInfoDto.setProfitTime(DateUtil.getTime(fruitProfitInfo.getCreateTime()));
                fruitProfitInfoDto.setProfitDate(fruitProfitInfo.getCreateTime());
                fruitProfitInfoDtoMap.put(fruitStockInfo.getId(),fruitProfitInfoDto);
            }
        }
        List<FruitProfitInfoDto> fruitProfitInfoDtoList = new ArrayList<>();
        for (Map.Entry<Long, FruitProfitInfoDto> entry : fruitProfitInfoDtoMap.entrySet()) {
            fruitProfitInfoDtoList.add(entry.getValue());
        }
        return fruitProfitInfoDtoList;
    }
}
